//为什么要用ts?
// es5：类型变化不报错
// var flag = true;
// flag = 234;

// ts：必须指定类型
// var flag1:boolean=true;
// flag1 = 131;//报错

//在开发中，有时候为了方便起见我们并不会在声明每一个变量时都写上对应的数据类型，我们更希望可以通过TypeScript本身的特性帮助我们推断出对应的变量类型

// 个人习惯: 默认情况下, 如果可以推导出对应的标识符的类型时, 一般情况下是不加类型
let  name = "why"
//  name=12 //  会报错,ts会推断出，你是number

//一.基本类型定义
//1.string类型
let str:string='aa'
str='ff'
console.log(str);

//2.number 类型
let nums:number=33
console.log(nums);

//3.boolean 类型

let b2:boolean=true
 b2=false
 console.log(b2);


// 4.Array数组类型:类型[]-在TypeScript开发中, 数组内最好存放的数据类型是固定的(string)
// 数组类型的定义有两种方式
let names:string[]=['a','b']  //推荐使用这种
let names2:Array<string>=['c','d']

names.push('s') //填加其它类型会报错
names2.push('s') 
console.log(names,names2);



//5.tuple元组类型-多种元素的组合x:[string,number,等等]

// 1.先看下数组的弊端-数组中通常建议存放相同类型的元素，不同类型的元素是不推荐放在数组中。（可以放在对象或者元组中）
// let arr5:any[]=['aaa',2,3] //不推荐这样,放不同类型
let arr5:string[]=['aaa','bb']
console.log(arr5[0].length);


//2.放元组里-元组中特点每个元素都有自己特性的类型，根据索引值获取到的值可以确定对应的类型；
let arr6:[string,number]=['aa',22]
console.log(arr6[0]);

//3.不同类型，也可放对象里
let obj={
  a:1,
  b:'2'
}
console.log(obj.a);




//6.Object类型-它表示非原始类型，也就是除number，string，boolean，symbol，null或undefined之外的类型
function create(obj: object | null){
      console.log(obj);
}
create({key:1}) //{key:1}
create(null); // null
// create(11); // Error

//6.1 ts中使用对象注意事项
let info = {
    name: "why",
    age: 18,
    name2:22
  }
//ts里不支持这样声明与调用
//  info['name2']=22
// console.log(info.name2)

//5.2 支持这种
console.log(info.name2)



//6.undefined 和 null 是两个基本数据类型
let n1: null = null
let n2: undefined = undefined
console.log(n1,n2);


//7.枚举类型enum-这个世界有很多值是多个并且是固定的，比如：一年的季节：春、夏、秋、冬 ，有四个结果。这种变量的结果是固定的几个数据时，就是我们使用枚举类型的最好时机
enum Color {red,yellow,blue}
let col:Color=Color.yellow
console.log(col); //1,默认情况下，从0开始为元素编号

//也可自定义编号
enum Color2 {yello=1,pink,red} 
let c:Color2= Color2.pink
console.log(c)//2 索引值

//枚举类型提供的一个便利是你可以由枚举的值得到它的名字
enum Color3 {red,yellow,blue}
let d:string= Color3[0]
console.log(d); //red



//注意-typescript会认为所有文件里的代码都是在一个作用域里的，所以即使在不同文件也不能申明同名变量
// let num:number=2  //此处有报错，跟另一个文件里的名字冲突
// console.log(num)
//解决办法1 
 export {}  

//解决方法2-加命名空间
// 使用namespace防止命名冲突，比如把每个文件里的代码包在一个namespace里。比如
// a.ts 文件
// namespace A {
//   let a = 1
// }

// // b.ts文件

// namespace B {
//   let a = 1
// }



